import logging
import os.path
import time


class InfoFilter(logging.Filter):
    def filter(self, record):
        """
        :param record:日志记录对象（由日志系统自动传入）
        :return:
        """
        return record.levelno == logging.INFO


class ErrorFilter(logging.Filter):
    def filter(self, record):
        """
        :param record:日志记录对象（由日志系统自动传入）
        :return:
        """
        return record.levelno == logging.ERROR


class Logger:
    logger = None

    @classmethod
    def getlog(cls):
        """
        设置日志的级别、日志保存在哪个文件
        不包含日志的写入
        :return:
        """
        # 创建日志记录器，负责收集日志
        cls.logger = logging.getLogger(__name__)
        cls.logger.setLevel(logging.DEBUG)

        # 避免重复添加Handler
        # if cls.logger.handlers:
        #     cls.logger.handlers.clear()

        # 按日期区分日志
        now = time.strftime("%Y-%m-%d")

        # 注意，由于是在D:\测试开发学习-gitee\test-development-learning\apiautotest_blog下运行代码的
        # 所以运行时，“.”所代表的当前路径是D:\测试开发学习-gitee\test-development-learning\apiautotest_blog
        # 而不是因为这份代码是在 D:\测试开发学习-gitee\test-development-learning\apiautotest_blog\utils\logger_util.py
        # 所以 “.”是D:\测试开发学习-gitee\test-development-learning\apiautotest_blog\utils\logger_util.py
        LOG_PATH = './logs/'

        # 判断目录是否存在
        if not os.path.exists(LOG_PATH):
            os.mkdir(LOG_PATH)

        # 日志保存到哪个文件，设置日志文件名
        info_log_name = LOG_PATH + now + "-info.log"
        error_log_name = LOG_PATH + now + "-error.log"
        log_name = LOG_PATH + now + ".log"

        # 创建日志处理器，处理日志要输出到哪里
        # 按日志等级区分日志
        log_handler = logging.FileHandler(log_name, encoding="utf-8")
        log_handler.setLevel(logging.INFO)

        info_handler = logging.FileHandler(info_log_name, encoding="utf-8")
        info_handler.setLevel(logging.INFO)
        info_handler.addFilter(InfoFilter())

        error_handler = logging.FileHandler(error_log_name, encoding="utf-8")
        error_handler.setLevel(logging.ERROR)
        error_handler.addFilter(ErrorFilter())

        # 日志写入的格式，注意%后面不要多了空格啊啊啊！！！
        formatter = logging.Formatter(
            "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s"
        )

        # 给所有的日志处理器设置日志格式
        log_handler.setFormatter(formatter)
        info_handler.setFormatter(formatter)
        error_handler.setFormatter(formatter)

        # 给日志收集器设置日志处理器
        # 将配置好的处理器handler绑定到记录器logger上
        cls.logger.addHandler(log_handler)
        cls.logger.addHandler(info_handler)
        cls.logger.addHandler(error_handler)

        return cls.logger

# if __name__=="__main__":
#     l=Logger.getlog()
#     l.info("求求你日志了")